package com.yyq.studyList;

import com.yyq.javastudy.Persion;
import org.junit.Test;
import sun.reflect.generics.tree.Tree;

import java.util.*;

/**
 * @author yyq
 * @create 2021-08-06 15:50
 *   //Set
 *   一、HashSet说明
 *   无序性：储存无序。并非按照底层数组中的索引顺序添加，而是根据数据的hash值
 *
 *   不可重复性:保证添加的元素按照equals()方法判断时，不能返回Ture,即相同的元素只能添加一个
 *   根据地址值。
 *
 *    二、添加元素的过程  HashSet说明
 *    我们向HashSet添加元素a，首先调用元素a所在类的hashcode()方法，计算元素a的哈希值，
 *    此哈希值根据某种算法计算出在HashSet底层数组中的存放位置（索引位置），判断此位置是否已经
 *    有元素
 *             如果此位置没有其他元素，则a添加成功
 *             如果此位置上有其他元素b(或者以链表形式存放的多个元素)，则比较元素a与元素b的哈希值
 *                     如果哈希值不同，则a添加成功
 *                     如果哈希值相同，则需要调用元素a所在类的equals()方法
 *                          equals()返回 false，则a添加成功
 *                          equals()返回 ture，则a添加失败
 *
 *
*
 *    底层是数组实现
 *    先算hashcode，然后取余或者其他操作算出对应数组的索引值，查看当前位置为空直接放入
 *    不空，再根据equals()比较，返回为false 在利用链表进行连接。
 *
 *
 *         //HashSet:作为Set接口的主要实现类;线程不安全的;可以存储null
 *                 //LinkHashSet:作为LinkHashSet的子类，遍历其内部数据时，可以按照添加
 *                 //顺序遍历
 *         //TreeSet:可以按照添加对象的指定属性进行排序
 */
public class SetTest {
    @Test
    public void test(){
        //Set中没有定义Collection
            Set set=new HashSet();
            set.add("123");
            set.add(123);
            set.add(new Persion(22,"YYQ"));
            set.add(new Persion(22,"YYQ"));
            Iterator iterator = set.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }


    }

    @Test
    //LinkHashSet
    //作为hashset的子类，在添加数据的同时，每个数据还维护了两个引用，记录了此数据前后的添加顺序
    //对于频繁遍历LinkedHashSet优于HashSet
    public void test1(){
        Set set=new LinkedHashSet();
        set.add("123");
        set.add(123);
        set.add(new Persion(22,"YYQ"));
        set.add(new Persion(22,"YYQ"));
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }



    @Test
    public void test3(){
        //TreeSet 同一个类的对象
        TreeSet treeSet=new TreeSet();
        treeSet.add(new Persion(23,"YYQ"));
        treeSet.add(new Persion(21,"Lr"));
        treeSet.add(new Persion(24,"HLZ"));
        treeSet.add(new Persion(222,"YYYYYYYQ"));
        treeSet.add(new Persion(222,"YYYQ"));

        Iterator iterator = treeSet.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }


    }

    @Test
    public void test4(){
        Comparator com =new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof Persion && o2 instanceof Persion){
                        Persion p1=(Persion)o1;
                        Persion p2=(Persion)o2;
                       return Integer.compare(p1.age,p2.age);

                }
                throw new RuntimeException("类型错误");
            }
        };
        //TreeSet 同一个类的对象
        TreeSet treeSet=new TreeSet(com);
        treeSet.add(new Persion(23,"YYQ"));
        treeSet.add(new Persion(21,"Lr"));
        treeSet.add(new Persion(24,"HLZ"));
        treeSet.add(new Persion(222,"YYYYYYYQ"));
        treeSet.add(new Persion(222,"YYYQ"));

        Iterator iterator = treeSet.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }


    }
}
